import random
import re


from django.http import HttpResponse,JsonResponse
from django.views import View
from django_redis import get_redis_connection
from celery_tasks.sms.tasks import ccp_send_sms_code
from apps.verifications.libs.captcha.captcha import captcha



class ImageCodeView(View):

    def get(self, request, uuid):

        # 1：获取参数
        # 2：校验参数
        # 3：数据处理---调用captch库生成图片和文字，图片返回给浏览器，文字写入数据库
        text, image = captcha.generate_captcha()

        try:
            conn = get_redis_connection("verify_code")
            conn.setex(
                'img_%s'% uuid,
                300,
                text,
            )
        except Exception as e:
            return HttpResponse("", status=500)

        return HttpResponse(
            image,
            content_type="image/jpeg"
        )


class SMSCodeView(View):

    def get(self, request, mobile):
        # 1:提取参数，用户输入的图片验证码，图片的uuid。
        image_code = request.GET.get("image_code")
        uuid = request.GET.get("image_code_id")

        # 2：校验参数
        # 存在性校验
        if not([image_code, uuid]):
            return JsonResponse({
                "code": 400,
                "errmsg": "参数存在错误",
            }, status=400)
        # 格式校验
        if not re.match(r'^[a-zA-Z0-9]{4}$', image_code):
            return JsonResponse({
                'code': 400,
                'errmsg': '图形验证码格式有误！'
            }, status=400)

                # 2.3、校验图片验证码的uuid
        if not re.match(r'^[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}$', uuid):
            return JsonResponse({
                'code': 400,
                'errmsg': 'uuid不符合格式'
            }, status=400)

        # 匹配校验---用户输入的图片验证码和redis存在的验证码是否相同。

        conn = get_redis_connection("verify_code")
        image_code_from_redis = conn.get('img_%s' % uuid)

            # 图片验证码：读一次，删一次，保证该图片验证码只会被使用"一次"！
        conn.delete('img_%s' % uuid)
        if not image_code_from_redis:
            # 没有读取到redis中的图形验证码 —— 可能过期了
            return JsonResponse({
                'code': 400,
                'errmsg': '图形验证码过期！'
            }, status=403)

        # 读取到了redis的验证码是字符串的字节形式，需要转化成字符串
        image_code_from_redis = image_code_from_redis.decode()
        # 全部转为小写比较，目的是忽略大小写
        if image_code.lower() != image_code_from_redis.lower():
            return JsonResponse({
                'code': 400,
                'errmsg': '验证码输入有误'
            }, status=400)

        # 检验标志位是否存在
        send_flag = conn.get('send_flag_%s' % mobile)
        if send_flag:
            return JsonResponse({'code': 400, 'errmsg': '请勿重复发送'}, status=403)
        # 3：数据处理---利用云通讯给用户发送验证码
        # 生成随机6位数的验证码
        sms_code = "%06d" % random.randint(0, 999999)

        # 将验证码写入数据库,键是手机号。
        conn.setex(
            'sms_%s' % mobile,
            1800,
            sms_code
        )
        # 存入一个标志 —— 表示用户在60秒内发送了短信
        conn.setex(
                'send_flag_%s' % mobile,
                60,
                '1'
            )

        # 利用云通讯发送验证码
        # CCP().send_template_sms(
        #     mobile,
        #     [sms_code, 30],
        #     1
        # )

        ccp_send_sms_code.delay(mobile, sms_code)


        # 4：构建响应
        return JsonResponse({
            'code': 0,
            'errmsg': 'ok'
        })

